package br.usfacar.acumaaf.smc.webservice;


import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.HttpConnectionParams;
import org.json.JSONObject;

import br.ufscar.acumaaf.smc.dao.DadoSessaoDAO;
import br.ufscar.acumaaf.smc.dao.SessaoDAO;
import br.ufscar.acumaaf.smc.model.DadoSessao;
import br.ufscar.acumaaf.smc.model.Sessao;

import android.content.Context;
import android.util.Log;

public class RestClientDadoSessao{
	//teste na máquina remota
	public final static String ENDERECO_WEBSERVICE_SINCRONIZA_DADOSESSAO = "http://192.168.1.103:8080/ACUMAAF-SIAF/jaxrs/sincronizaDadoSessao";
    //teste no localhost
	//public final static String ENDERECO_WEBSERVICE_SINCRONIZA_DADOSESSAO = "http://10.0.2.2:8080/ACUMAAF-SIAF/jaxrs/sincronizaDadoSessao";
		
	/**
	 * 
	 * Métodos enviaSincronizacaoTabelaDadoSessao
	 * para sincronizar os dados da sessão registrado no SMC com a tabela do SIAF
	 * 
	 */
	
	//Método que envia para o SIAF os dados fisiológicos registrados no SMC
	public static boolean enviaSincronizacaoTabelaDadoSessao(Context context){
		HttpClient httpClient = new DefaultHttpClient();
		HttpConnectionParams.setConnectionTimeout(httpClient.getParams(), 10000);
		HttpResponse response;
		JSONObject json;
		List<JSONObject> lJson = new ArrayList<JSONObject>();
		try{
			HttpPut put = new HttpPut(ENDERECO_WEBSERVICE_SINCRONIZA_DADOSESSAO);
			List<Sessao> listaSessao = new ArrayList<Sessao>();
			List<DadoSessao> listaDadoSessao = new ArrayList<DadoSessao>();
			for (Sessao sessao : new SessaoDAO(context).buscarTodasSessoesParaSincronizar()) {
				for(DadoSessao dadoSessao : new DadoSessaoDAO(context).buscarTodosDadosSessoesPeloCodigoSessao(sessao.getCodigoSessao())){
					json = new JSONObject();
					json.put("codigosessao", dadoSessao.getCodigoSessao());
					json.put("codigousuario", dadoSessao.getCodigoUsuario());
					json.put("codigoinstrumentocoleta", dadoSessao.getCodigoInstrumentoColeta());
					json.put("valor", dadoSessao.getValor());
					lJson.add(json);
					listaDadoSessao.add(dadoSessao);
				}
				listaSessao.add(sessao);
			}
			StringEntity se = new StringEntity("{\"dadosessaoJson\":" + lJson.toString() + "}");
			Log.i("smc","RestClient:enviaSincronizacaoDadoSessao | Objeto lJson " + lJson);
			put.setEntity(se);
			put.setHeader("Accept","application/json");
			put.setHeader("Content-type", "application/json");
			
			if(listaDadoSessao.isEmpty()){
				for (Sessao sessao : listaSessao) {
					sessao.setExcluir(1);
					new SessaoDAO(context).atualizaSessao(sessao);
					new SessaoDAO(context).deletaSessao(Long.valueOf(sessao.getCodigoSessao()));
				}
				return true;
			}
			else{
				response = httpClient.execute(put);
				if(response != null){
					InputStream in = response.getEntity().getContent();
					Log.i("smc","RestClient:enviaSincronizacaoDadoSessao | Finalizando a Sincronização");
					Log.i("smc", "Conteúdo de inputstream: " + in.toString());
					
					
					//Deleta os registros que foram sincronizados
					for (DadoSessao dadoSessao : listaDadoSessao) {
						new DadoSessaoDAO(context).deletaDadoSessao(Long.valueOf(dadoSessao.getCodigoDadoSessao()));
					}
					for (Sessao sessao : listaSessao) {
						sessao.setExcluir(1);
						new SessaoDAO(context).atualizaSessao(sessao);
						new SessaoDAO(context).deletaSessao(Long.valueOf(sessao.getCodigoSessao()));
					}
					return true;
				}
			}
		}catch(Exception e){
			e.printStackTrace();
			Log.e("erro","Cannot Estabilish Connection");
			return false;
		}
		return false;
	}
}